﻿// 7-16 月饼 (25 分)

//user:lidongcheng
//level:6
//date:20191108
//key:注意double型是用printf("%0.2lf", total); 来保留小数点后2位，网上说是Lf是long double好像

#include <iostream>
#include<algorithm>
using namespace std;
void swap(double* a, double* b, int i){
	double a1, b1;
	a1 = a[i];
	a[i] = a[i + 1];
	a[i + 1] = a1;

	b1 = b[i];
	b[i] = b[i + 1];
	b[i + 1] = b1;
}
void bsort(double* a, double*b,int n) {//a这里是传值引用，就是会对a内值做修改
	int i;
	int j;

	n--;//因为在main函数里这个n对于数组来说是多一个的。
	for (j = 0; j < n; j++) 
	{
		for (i = 0; i < n; i++)//冒泡排序，使比值最高那个排最前
		{

			if (double(b[i] / a[i]) < double(b[i + 1] / a[i + 1]))
			{
				swap(a, b, i);
				
			}
		}
	}
}
int main()
{
	int n, k;
	cin >> n >> k;
	int i;
	double* a = new double[n];//存每种吨数
	double* b = new double[n];//存全部卖出的总价格
	for (i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	for (i = 0; i < n; i++)
	{
		cin >> b[i];
	}
	bsort(a, b,n);//排序函数，按b/a的值重新拍一次
	double total = 0;
	double total_n = 0;
	if (k > a[0]) //第一种就超过市场需求的话
	{
		for (i = 0; i < n; i++)
		{
			if (k > total_n)
			{

				total_n = total_n + a[i];
				//cout << total_n<<endl;
				total = total + b[i];
			}
			else//当到了这里就是上一轮的品种加上之后已经超过市场需求，而且i还加了1
			{
				i--;//使数组指回前一个
				total_n = total_n - a[i];//使总吨数变回前一个
				total = total - b[i];//使总售价变回前一个
				total = total + (b[i]/a[i])*(k-total_n);
				break;
			}
		}
	}
	else
	{
		total=(b[0] / a[0])* k;
	}
	//cout << total;
	printf("%0.2lf", total);  //保留小数点后2位
}
